package com.tom.architect02.zframework.handler.maniu;

public class Looper {
//    一个线程 有 1个loop，对应一个队列。队列与looper绑定。
//  利用threadLocal  ---》ThreadLocalMap
    static ThreadLocal<Looper> sThreadLocal = new ThreadLocal<>(); // 单例
    MessageQueue messageQueue;

    //    保证Looper唯一   messageQueue也唯一了
    private Looper() {
        messageQueue = new MessageQueue();
    }
    public static Looper myLooper() {
        return sThreadLocal.get();
    }
//    Looper   的生命周期   多长？  当前线程生命周期的长度。
    public static void  prepare() { // 保证唯一一个looper。
//   自己的对象 作为key  -----》 Looper
//   一个 线程 ----保证只有一个Looper，保证Looper唯一，进而保证队列唯一 ？
//   1. 利用 sThreadLocal   将  Looper 对象 存到了Thread对象中map中；
//   2. 第二次调用，如果之前有存，直接异常。
        if (sThreadLocal.get() != null) { // 以当前线程自己的对象，作为key去找。
            throw new RuntimeException("Only one Looper may be created per thread");
        }
//       sThreadLocal key--- Looper。 当前线程--hashMap--存入key（ThreadLocal对象），value（Looper）。
        sThreadLocal.set(new Looper());
    }

    // 等待消息，处理消息。
    public static void looper() {
        final Looper me = myLooper();
        final MessageQueue queue = me.messageQueue;
        for (; ; ) {
            Message msg = queue.next();
            msg.target.handleMessage(msg); // target就是handler。
//            无 解   架构师  程序 使用 架构  声明个Handler
//            Google工程师
//            handleMessage(msg);
        }
    }
}
